import { createRouter, createWebHashHistory } from 'vue-router'
import { transformMenusToRoutes, getFirstMenuPath } from '@/utils/routerHelper'
import Login from '../views/Login.vue'
import Register from '../views/Register.vue'
import NotFound from '../views/NotFound.vue'

// 固定路由 - 登录和注册页面
const staticRoutes = [{
        path: '/',
        redirect: '/login'
    },
    {
        path: '/login',
        name: 'Login',
        component: Login,
        meta: {
            title: '登录',
            requiresAuth: false
        }
    },
    {
        path: '/register',
        name: 'Register',
        component: Register,
        meta: {
            title: '注册',
            requiresAuth: false
        }
    },
    {
        path: '/:pathMatch(.*)*',
        name: 'NotFound',
        component: NotFound,
        meta: {
            title: '页面未找到',
            requiresAuth: false
        }
    }
]

const router = createRouter({
    history: createWebHashHistory(),
    routes: staticRoutes
})

/**
 * 动态添加路由
 * @param {Array} menus - 后端返回的菜单数据
 * @returns {Array} 转换后的路由配置
 */
export function addDynamicRoutes(menus) {
    if (!menus || menus.length === 0) {
        console.warn('没有可用的菜单数据')
        return []
    }

    // 转换菜单为路由配置
    const dynamicRoutes = transformMenusToRoutes(menus)

    // 添加动态路由到路由器
    dynamicRoutes.forEach(route => {
        router.addRoute(route)
    })

    // 保存菜单数据到 sessionStorage，用于页面刷新后恢复
    sessionStorage.setItem('userMenus', JSON.stringify(menus))

    console.log('动态路由已添加:', dynamicRoutes)
    return dynamicRoutes
}

/**
 * 从 sessionStorage 恢复动态路由
 * @returns {Array} 恢复的路由配置
 */
export function restoreDynamicRoutes() {
    const menusJson = sessionStorage.getItem('userMenus')
    if (menusJson) {
        try {
            const menus = JSON.parse(menusJson)
            return addDynamicRoutes(menus)
        } catch (e) {
            console.error('恢复动态路由失败:', e)
            sessionStorage.removeItem('userMenus')
        }
    }
    return []
}

/**
 * 清除动态路由相关数据
 */
export function clearDynamicRoutes() {
    sessionStorage.removeItem('userMenus')
    sessionStorage.removeItem('userInfo')
    sessionStorage.removeItem('userPermissions')
    sessionStorage.removeItem('userRoles')
}

/**
 * 获取当前用户的菜单
 * @returns {Array} 菜单数据
 */
export function getUserMenus() {
    const menusJson = sessionStorage.getItem('userMenus')
    if (menusJson) {
        try {
            return JSON.parse(menusJson)
        } catch (e) {
            console.error('获取用户菜单失败:', e)
        }
    }
    return []
}

// 路由守卫 - 登录验证和页面标题设置
router.beforeEach(async(to, from, next) => {
    console.log('========== 路由守卫开始 ==========')
    console.log('从', from.path, '到', to.path)
    console.log('目标路由匹配结果:', to.matched.length, '个匹配')

    // 设置页面标题
    if (to.meta && to.meta.title) {
        document.title = `${to.meta.title} - 内容管理系统`
    }

    // 检查是否已登录
    const accessToken = localStorage.getItem('accessToken')
    const requiresAuth = to.meta.requiresAuth !== false // 默认需要认证

    console.log('登录状态:', {
        hasToken: !!accessToken,
        requiresAuth,
        toPath: to.path,
        matchedCount: to.matched.length
    })

    // 未登录用户访问根路径或需要认证的页面，跳转到登录页
    if (!accessToken && (to.path === '/' || requiresAuth)) {
        console.log('❌ 未登录，跳转到登录页')
        if (to.path !== '/login') {
            next('/login')
        } else {
            next()
        }
        return
    }

    // 已登录用户访问登录页或注册页，重定向到第一个菜单页
    if (accessToken && (to.path === '/login' || to.path === '/register')) {
        console.log('✅ 已登录，尝试跳转到菜单页')
        const menus = getUserMenus()
        if (menus && menus.length > 0) {
            const firstPath = getFirstMenuPath(menus)
            console.log('→ 跳转到第一个菜单:', firstPath)
            next(firstPath)
        } else {
            console.log('⚠️ 没有菜单数据，跳转到登录页')
            localStorage.removeItem('accessToken')
            next('/login')
        }
        return
    }

    // 已登录用户访问根路径，重定向到第一个菜单页
    if (accessToken && to.path === '/') {
        console.log('✅ 已登录访问根路径，跳转到菜单页')
        const menus = getUserMenus()
        if (menus && menus.length > 0) {
            const firstPath = getFirstMenuPath(menus)
            console.log('→ 跳转到第一个菜单:', firstPath)
            next(firstPath)
        } else {
            console.log('⚠️ 没有菜单数据，跳转到登录页')
            localStorage.removeItem('accessToken')
            next('/login')
        }
        return
    }

    // 如果有 token 且需要认证的页面，检查是否需要恢复动态路由
    if (accessToken && requiresAuth && to.matched.length === 0) {
        console.log('⚠️ 路由未匹配，检查菜单数据...')
        const menus = getUserMenus()

        if (menus && menus.length > 0) {
            console.log('📋 找到菜单数据，恢复动态路由...')
            console.log('菜单列表:', menus.map(m => `${m.menuName}(${m.path})`).join(', '))

            // 恢复动态路由
            const routes = restoreDynamicRoutes()
            console.log('✅ 动态路由已恢复:', routes.length, '个路由')

            // 使用 nextTick 确保路由完全注册
            await new Promise(resolve => setTimeout(resolve, 10))

            // 再次检查路由是否存在
            const hasRoute = router.hasRoute(to.name) || router.resolve(to.path).matched.length > 0
            console.log('路由检查结果:', {
                hasRouteName: router.hasRoute(to.name),
                resolveMatched: router.resolve(to.path).matched.length,
                targetPath: to.path
            })

            if (hasRoute) {
                console.log('→ 路由已存在，重新导航')
                next({...to, replace: true })
            } else {
                console.log('❌ 路由仍不存在，跳转到第一个菜单')
                const firstPath = getFirstMenuPath(menus)
                next(firstPath)
            }
            return
        } else {
            console.log('❌ 没有菜单数据，跳转到登录页')
            localStorage.removeItem('accessToken')
            next('/login')
            return
        }
    }

    // 正常放行
    console.log('✅ 正常放行')
    console.log('========== 路由守卫结束 ==========\n')
    next()
})

export default router